﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using MySql.Data.MySqlClient;
using MySql.Data.Types;


namespace Gui.Functies
{
    public partial class Takenlijst : UserControl
    {
        private int projectID;
        private Hashtable takenBezig = new Hashtable(); //taaknaam, taakid
        private Hashtable takenKlaar = new Hashtable(); //taaknaam, taakid
        private Hashtable takenNietKlaar = new Hashtable(); //taaknaam, taakid
        private Hashtable projectLeden = new Hashtable(); //naam, id

        //voor het laten zien van de taak_lid tabel moet er op ID's gezocht worden, op values in de hashtables is niet mogelijk dus maar even globale tabellen aanmaken (scheelt queries)
        private Hashtable taakLeden = new Hashtable(); //id, taak
        private Hashtable taken = new Hashtable(); //id, naam

        private MySqlConnection grabConnection = new MySqlConnection("Server=qq-design.com;Port=3306;Database=cookicom0;Uid=cookicom0;pwd=pizzahut91");

        public Takenlijst()
        {
            
        }

        public Takenlijst(int projectnummer)
        {
            projectID = projectnummer;
            InitializeComponent();
            getLeden();
            getTaken(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            loadFunction(1);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            loadFunction(2);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            loadFunction(3);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            loadFunction(4);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            takenBezig.Clear();
            takenKlaar.Clear();
            takenNietKlaar.Clear();
            taakLeden.Clear();
            taken.Clear();
            projectLeden.Clear();
            getLeden();
            getTaken();
        }

        private void loadFunction(int choice)
        {
            int panel = choice;

            switch (panel)
            {
                case 1:
                    this.Controls.Clear();
                    this.Controls.Add(new Functies.Takenlijst_windows.Addtaak(projectID));
                    break;
                case 2:
                    this.Controls.Clear();
                    this.Controls.Add(new Functies.Takenlijst_windows.Removetaak(projectID, takenBezig, takenKlaar, takenNietKlaar));
                    break;
                case 3:
                    this.Controls.Clear();
                    this.Controls.Add(new Functies.Takenlijst_windows.Addlid(projectID, takenBezig, takenKlaar, takenNietKlaar, projectLeden));
                    break;
                case 4:
                    this.Controls.Clear();
                    this.Controls.Add(new Functies.Takenlijst_windows.Edittaak(projectID, takenBezig, takenKlaar, takenNietKlaar));
                    break;
            }
        }
        //toont de taken uit de hashtable
        private void displayTaken()
        {
            listView1.Items.Clear();
            //taken weergeven die niet klaar zijn
            foreach (string key in takenNietKlaar.Keys)
            {
                ListViewItem item = new ListViewItem(String.Format("{0}", key, takenNietKlaar[key]));
                item.SubItems.Add(get_taaklid_nietklaar(String.Format("{0}", key, takenNietKlaar[key])));
                item.SubItems.Add("Niet klaar");
                listView1.Items.Add(item);
            }

            //taken weergeven die bezig zijn
            foreach (string key in takenBezig.Keys)
            {
                ListViewItem item = new ListViewItem(String.Format("{0}", key, takenBezig[key]));
                item.SubItems.Add(get_taaklid_bezig(String.Format("{0}", key, takenBezig[key])));
                item.SubItems.Add("Bezig");
                listView1.Items.Add(item);
            }

            //taken weergeven die klaar zijn
            foreach (string key in takenKlaar.Keys)
            {
                ListViewItem item = new ListViewItem(String.Format("{0}", key, takenKlaar[key]));
                item.SubItems.Add(get_taaklid_klaar(String.Format("{0}", key, takenKlaar[key])));
                item.SubItems.Add("Klaar");
                listView1.Items.Add(item);
            }
        }

        //haalt alles op voor hashtables die verstuurd worden naar functies
        private void getTaken()
        {
            string taak;
            string id;

            //alle taken ophalen waar de status Bezig is
            try
            {
                grabConnection.Open();
                MySqlCommand takenGet = new MySqlCommand("SELECT TaakID, Taak FROM taken WHERE ProjectID='"+projectID+"'AND Status='Bezig'", grabConnection);

                MySqlDataReader reader = takenGet.ExecuteReader();

                while (reader.Read())
                {
                    taak = reader["Taak"].ToString();
                    id = reader["TaakID"].ToString();
                    takenBezig.Add(taak, id);
                    taken.Add(id, taak);
                }

                reader.Dispose();
                takenGet.Dispose();
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.ToString());
            }
            
            //alle taken ophalen waar de status Klaar is
            try
            {
                MySqlCommand takenGet = new MySqlCommand("SELECT TaakID, Taak FROM taken WHERE ProjectID='"+projectID+"'AND Status='Klaar'", grabConnection);
                MySqlDataReader reader = takenGet.ExecuteReader();

                while (reader.Read())
                {
                    taak = reader["Taak"].ToString();
                    id = reader["TaakID"].ToString();
                    takenKlaar.Add(taak, id);
                    taken.Add(id, taak);
                }

                reader.Dispose();
                takenGet.Dispose();
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.ToString());
            }

            //alle taken ophalen waar de status Niet klaar is
            try
            {
                MySqlCommand takenGet = new MySqlCommand("SELECT TaakID, Taak FROM taken WHERE ProjectID='"+projectID+"'AND Status='Niet klaar'", grabConnection);

                MySqlDataReader reader = takenGet.ExecuteReader();

                while (reader.Read())
                {
                    taak = reader["Taak"].ToString();
                    id = reader["TaakID"].ToString();
                    takenNietKlaar.Add(taak, id);
                    taken.Add(id, taak);
                }

                reader.Dispose();
                takenGet.Dispose();
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.ToString());
            }

            grabConnection.Close();
            displayTaken();
        }

        //leden ophalen uit project_members tabel, ids --> voornaam setten
        private void getLeden()
        {
            //array voor userids, aangezien deze uit een aparte tabel opgehaal moeten worden
            string[] userIds = new string[100];
            int counter = 0;
            string id;
            string naam;

            try
            {
                MySqlCommand retrieveIds = new MySqlCommand("SELECT UserID FROM project_members WHERE ProjectID='" + projectID + "'", grabConnection);
                grabConnection.Open();
                MySqlDataReader getIds = retrieveIds.ExecuteReader();

                while (getIds.Read())
                {
                    if (getIds["UserID"].ToString() == null)
                    {
                        break;
                    }

                    userIds[counter] = getIds["UserID"].ToString();
                    counter++;
                }

                counter = 0;
                getIds.Close();

                for (int i = 0; i <= userIds.Length; i++)
                {
                    if (userIds[i] == null)
                    {
                        break;
                    }

                    MySqlCommand retrieveUsers = new MySqlCommand("SELECT Naam FROM confirmed_users WHERE UserID='"+userIds[i]+"'", grabConnection);
                    MySqlDataReader getNames = retrieveUsers.ExecuteReader();

                    while (getNames.Read())
                    {
                        id = userIds[i].ToString();
                        naam = getNames["Naam"].ToString();
                        projectLeden.Add(naam, id);
                        taakLeden.Add(id, naam);
                    }

                    getNames.Close();
                }
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.ToString());
            }

            grabConnection.Close();
        }
        
        //lid ophalen die bij taak hoort, aparte methodes zijn hiervoor gemaakt om een taak status query te vermijden
        private string get_taaklid_bezig(string task)
        {
            //id word opgehaald uit hashtable, hierna word een query uitgevoerd om het lid te zoeken wat er bij hoort
            string taak = task;
            string taakid = takenBezig[taak].ToString();
            string lid = "geen lid gekoppeld";
            string userid;

            try
            {
                MySqlCommand retrievelid = new MySqlCommand("SELECT UserID FROM taak_lid WHERE TaakID='" + taakid + "'", grabConnection);
                grabConnection.Open();
                MySqlDataReader reader = retrievelid.ExecuteReader();

                while (reader.Read())
                {
                    userid = reader[0].ToString();
                    if (userid == null)
                    {
                        break;
                    }
                    else
                    {
                        lid = taakLeden[userid].ToString();
                        break;
                    }
                }

                reader.Dispose();
            }
            catch (Exception ex)
            {
                if (ex is MySqlException || ex is NullReferenceException)
                {
                    lid = "Geen lid gekoppeld";
                }
            }

            grabConnection.Close();
            return lid;
        }

        private string get_taaklid_nietklaar(string task)
        {
            //id word opgehaald uit hashtable, hierna word een query uitgevoerd om het lid te zoeken wat er bij hoort
            string taak = task;
            string taakid = takenNietKlaar[taak].ToString();
            string lid = "geen lid gekoppeld";
            string userid;

            try
            {
                MySqlCommand retrievelid = new MySqlCommand("SELECT UserID FROM taak_lid WHERE TaakID='" + taakid + "'", grabConnection);
                grabConnection.Open();
                MySqlDataReader reader = retrievelid.ExecuteReader();

                while (reader.Read())
                {
                    userid = reader[0].ToString();
                    if (userid == null)
                    {
                        break;
                    }
                    else
                    {
                        lid = taakLeden[userid].ToString();
                        break;
                    }
                }

                reader.Dispose();
            }
            catch (Exception ex)
            {
                if (ex is MySqlException || ex is NullReferenceException)
                {
                    lid = "Geen lid gekoppeld";
                }
            }

            grabConnection.Close();
            return lid;
        }

        private string get_taaklid_klaar(string task)
        {
            //id word opgehaald uit hashtable, hierna word een query uitgevoerd om het lid te zoeken wat er bij hoort
            string taak = task;
            string taakid = takenKlaar[taak].ToString();
            string lid = "geen lid gekoppeld";
            string userid;
            
            try
            {
                MySqlCommand retrievelid = new MySqlCommand("SELECT UserID FROM taak_lid WHERE TaakID='"+taakid+"'", grabConnection);
                grabConnection.Open();
                MySqlDataReader reader = retrievelid.ExecuteReader();

                while (reader.Read())
                {
                    userid = reader[0].ToString();
                    if (userid == null)
                    {
                        break;
                    }
                    else
                    {
                        lid = taakLeden[userid].ToString();
                        break;
                    }
                }

                reader.Dispose();
            }
            catch (Exception ex)
            {
                if (ex is MySqlException || ex is NullReferenceException)
                {
                    lid = "Geen lid gekoppeld";
                }
            }

            grabConnection.Close();
            return lid;
        }
    }
}